﻿/////////////////////////////////////////////////
//文件名:Storage
//描  述:
//创建者:刘凡平(Iveely Liu)
//邮  箱:945222889@qq.com
//组  织:Iveely
//年  份:2012/5/12 15:54:45
///////////////////////////////////////////////


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;

namespace IveelySE.BigData.MasterNode
{
    /// <summary>
    /// 存储信息类
    /// </summary>
    public class Storage
    {
        /// <summary>
        /// 构造方法（实现记录的初始化）
        /// </summary>
        public Storage()
        {
            //如果文件存在
            if (File.Exists("Storage"))
            {
                //反序列化
                this.sortTable = (Common.DataStruct.SortTable)Common.Serialize.UnSerailzable("Storage");
            }
            //如果文件不存在
            else
            {
                //如果没有新建
                this.sortTable = new Common.DataStruct.SortTable();
            }
        }

        /// <summary>
        /// 排序表
        /// </summary>
        private Common.DataStruct.SortTable sortTable { get; set; }

        /// <summary>
        /// 存储结点
        /// </summary>
        /// <param name="node">存储数据的结点</param>
        /// <param name="fileName">被存储数据所在的文件名</param>
        /// <param name="dataId">被存储数据的编号</param>
        public void Add(StoreNode node, string fileName, int dataId)
        {
            
            double key = Math.Abs(fileName.GetHashCode()) + dataId / double.MaxValue;
            this.sortTable.Add(key, node);
            //每100条写回本地文件一次
            if ((this.sortTable.Count+1) % 100 == 0)
            {
                this.Save();
            }
        }
        /// <summary>
        /// 查找某个文件的某编号数据
        /// </summary>
        /// <param name="fileName">文件名</param>
        /// <param name="fileId">数据编号</param>
        /// <returns></returns>
        public StoreNode Find(string fileName, int fileId)
        {
            double key = Math.Abs(fileName.GetHashCode()) + fileId / double.MaxValue;
            return (StoreNode)sortTable[key];
        }

        /// <summary>
        /// 获取一个文件的所有数据
        /// </summary>
        /// <param name="fileName">文件名</param>
        /// <returns></returns>
        public object[] Find(string fileName)
        {
            //建立列表
            return sortTable.GetValues(Math.Abs(fileName.GetHashCode())).ToArray();
        }

        /// <summary>
        /// 存储当前所有记录信息
        /// </summary>
        public void Save()
        {
            Common.Serialize.Serailzable(this.sortTable, "Storage");
        }

    }
}
